package main

import (
	"bufio"
	"fmt"
	"os"
)

/*
字符类型  byte rune

编码  人类语言与机器语言 --映射
ASCII -- 英文字符
Unicode -- 万国码   utf-8  gpk  是Unicode具体实现，实现存入磁盘

byte -- uint8
runne -- uint32

字符串类型 string 用" "包裹
*/
func main() {
	//var c1 byte
	//c1 = 97
	//fmt.Println(c1, string(c1)) //string 将字符类型转换成 文字
	//c2 := '中'                   //用单引号引起来的单个字符，得到是字节码
	//fmt.Println(c2)
	//fmt.Printf("%T", c2)
	//c3 := '中国' //不能用单引号作用多个字符
	//fmt.Println(c3)

	//str1 := "中"
	//fmt.Println(str1)
	//str2 := "中国"
	//fmt.Println(str2)

	//var str1 string
	//str1 = "abcxyzdd中国"
	//统计字符串的长度
	//len_str := len(str1)
	//fmt.Println(len_str)
	//fmt.Println(str1, unsafe.Sizeof(str1))
	//
	//str2 := "hello, 中国"
	//count := utf8.RuneCountInString(str2)
	//fmt.Println(count)

	//转义字符 -- 含有特殊含义的字符
	/*
		\t 制表符
		\n 换行符
		\" 双引号本身

	*/

	//str3 := "a\"b"
	//fmt.Println(str3)
	//// 字符串原样输出
	//str4 := `a"b`
	//fmt.Println(str4)
	//fmt.Println(`a\tb`)

	//字符串的截取[start:end]  按字节截取
	//str2 := "abcxyz,hello"
	//fmt.Println(str2[0:5])
	//fmt.Println(str2[:5])
	//fmt.Println(str2[4:])
	//str3 := "中文你好👇"
	//fmt.Println(str3[0:])
	//fmt.Println(len(str3))

	//字符串和其他数据的转换 -- strconv
	//num1 := 100
	//fmt.Println(string(num1))

	//num1 := 200
	//str1 := strconv.Itoa(num1) //整型 --》 字符串
	//fmt.Printf("str1 is:%s, type is %T\n", str1, str1)

	//字符串 --》 整型
	//str2 := "100"
	//v, e := strconv.Atoi(str2)
	//if e != nil{
	//	fmt.Println("转换出错")
	//
	//}else {
	//	fmt.Println("v is %d, tpye is%T\n", v, v)
	//}
	/*
		% 占位符输出控制
		  -- %s 字符串
		     %d 十进制整数
		     %x 十六进制整数
			 %% %号本身
		     %T 输出类型
			 %.2f 保留两个数的浮点型
			 %v 输出具体值
	*/

	//将格式化好的字符串赋值给另一个变量
	//str3 := fmt.Sprintf("name is %s, age is %d", "luobiao", 22)
	//fmt.Println(str3)

	//字符串的遍历
	//str1 := "abcdef"
	//str2 := "hello, 中国"
	////下标遍历
	//for i := 0; i < len(str1); i++ {
	//	fmt.Printf("%v(%c), type is %T \n", str1[i], str1[i], str1[i])
	//
	//}
	////按字符个数遍历  返回两个参数 第一个参数 --下标 第二个参数 具体的值
	//for _, i := range str2 {
	//	fmt.Println(i, string(i))
	//}

	//接收用户从键盘输入的任意字符串，统计其中英文字母、数字、其他字符
	//reader := bufio.NewReader(os.Stdin)
	//fmt.Print("请输入任意字符串: ")
	//input, _ := reader.ReadString('\n') // 读取一行，直到遇到换行符
	//input = input[:len(input)-1]         // 去掉换行符
	//
	//// 初始化计数器
	//lettersCount := 0
	//digitsCount := 0
	//othersCount := 0
	//
	//// 遍历字符串中的每个字符
	//for _, char := range input {
	//	if unicode.IsLetter(char) {
	//		lettersCount++
	//	} else if unicode.IsDigit(char) {
	//		digitsCount++
	//	} else {
	//		othersCount++
	//	}
	//}
	//
	//// 打印结果
	//fmt.Printf("英文字母数量: %d\n", lettersCount)
	//fmt.Printf("数字数量: %d\n", digitsCount)
	//fmt.Printf("其他字符数量: %d\n", othersCount)
	//fmt.Print("请输入:")
	//math_count := 0
	//English_count := 0
	//other_count := 0
	//reader := bufio.NewReader(os.Stdin)
	//input, _ := reader.ReadString('\n')
	//input = input[:len(input)-1]
	//fmt.Println(len(input))
	//for _, char := range input {
	//	if unicode.IsLetter(char) {
	//		English_count++
	//	} else if unicode.IsDigit(char) {
	//		math_count++
	//	} else {
	//		other_count++
	//	}
	//}
	//fmt.Printf("英文字母数量: %d\n", English_count)
	//fmt.Printf("数字数量: %d\n", math_count)
	//fmt.Printf("其他字符数量: %d\n", other_count)

	//接收用户从键盘输入的字符串，统计出现次数最多的字符以及最少的字符
	//输入对应的次数，以及是哪个字符（字数相等则输出前一个字符）

	reader := bufio.NewReader(os.Stdin)
	fmt.Print("请输入任意字符串: ")
	input, _ := reader.ReadString('\n') // 读取一行，直到遇到换行符
	input = input[:len(input)-1]        // 去掉换行符

	// 初始化字符计数map
	charCount := make(map[rune]int)

	// 遍历字符串中的每个字符并计数
	for _, char := range input {
		charCount[char]++
	}

	// 初始化最大和最小计数
	maxCount := 0
	minCount := len(input) + 1 // 初始化为一个比字符串长度还大的数
	maxChar := rune(0)
	minChar := rune(0)

	// 遍历map，找到出现次数最多的字符和出现次数最少的字符
	for char, count := range charCount {
		if count > maxCount {
			maxCount = count
			maxChar = char
		}
		if count < minCount && count > 0 { // 忽略计数为0的字符
			minCount = count
			minChar = char
		}
	}

	// 输出结果
	fmt.Printf("出现次数最多的字符: '%c'，出现次数: %d\n", maxChar, maxCount)
	fmt.Printf("出现次数最少的字符: '%c'，出现次数: %d\n", minChar, minCount)
}
